package com.sojson.base.impl;

import java.util.Date;

import com.alibaba.fastjson.annotation.JSONField;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.sojson.constant.Constant;
import com.sojson.constant.ConstantByMap;
import com.sojson.enums.core.EDisableAtType;
import com.sojson.enums.core.ELoginMoreOnlineType;
import com.sojson.enums.core.ESex;
import com.sojson.enums.core.EUserStatus;
import com.sojson.util.DateUtil;
import com.sojson.util.StringUtil;
import com.sojson.util.token.TokenDto;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

/**
 * 用户基础Bean
 * 
 * @author liu
 * @date 2021-04-05
 */
@Data
@ApiModel("用户基础Bean")
public class BaseUser extends BaseLogicDelBean {

    /***/
    private static final long serialVersionUID = 1L;
    /** ID */
    @ApiModelProperty("ID")
    private String id;
    /** 昵称 */
    @ApiModelProperty("昵称")
    private String nickName;
    /** 头像 */
    @ApiModelProperty("头像")
    private String headImg;
    /** 姓名 */
    @ApiModelProperty("姓名")
    private String name;
    /** 年龄 */
    @ApiModelProperty("年龄")
    private Integer age;
    /** 性别 */
    @ApiModelProperty("性别(1:未知,2:男,3:女)")
    private Integer sex;
    /** 邮箱 */
    @ApiModelProperty("邮箱")
    private String mail;
    /** 帐号 */
    @ApiModelProperty("帐号")
    private String username;
    /** 手机号 */
    @ApiModelProperty("手机号")
    private String mobile;
    /** 密码 */
    @JSONField(serialize = false)
    @JsonIgnore
    @ApiModelProperty("密码")
    private String pwd;
    /** 数据权限(1:全部数据权限,2:自定数据权限,3:部门数据权限,4:部门及以下数据权限,5:仅本人数据权限) */
    @ApiModelProperty("数据权限(1:全部数据权限,2:自定数据权限,3:部门数据权限,4:部门及以下数据权限,5:仅本人数据权限)")
    private Integer dataScope;
    /** 部门树选择项是否关联显示(1:是,0:否) */
    @ApiModelProperty("部门树选择项是否关联显示(1:是,0:否)")
    private Boolean deptCheckStrictly;
    /** 部门ID */
    @ApiModelProperty("部门ID")
    private String deptId;
    /** 此帐号允许在多地同时在线的类型(1:不限制登录数量,2:只允许一台设备登录,3:每种类型的设备只允许一台登录,4:所有设备只允许一定数量登录,5:每种类型的设备允许一定数量登录) */
    @ApiModelProperty("此帐号允许在多地同时在线的类型(1:不限制登录数量,2:只允许一台设备登录,3:每种类型的设备只允许一台登录,4:所有设备只允许一定数量登录,5:每种类型的设备允许一定数量登录)")
    private Integer typeMoreOnline;
    /** 此帐号允许同时在线的最大数量 */
    @ApiModelProperty("此帐号允许同时在线的最大数量")
    private Integer onlineMaxNumber;
    /** 有效时间类型(1:永久,2:限时) */
    @ApiModelProperty("有效时间类型(1:永久,2:限时)")
    private Integer disableAtType;
    /** 有效时间 */
    @ApiModelProperty("有效时间")
    private Date disableAt;
    /** 状态 1正常 2禁用 */
    @ApiModelProperty("状态 1正常 2禁用")
    private Integer status;

    /**
     * 插入初始化
     * 
     * @param dto
     * @throws Exception
     */
    public void insertInit(TokenDto dto) throws Exception {
        // 同时在线数量
        setTypeMoreOnline(ELoginMoreOnlineType.NO.getCode());
        setOnlineMaxNumber(1);
        // 状态
        setStatus(EUserStatus.NORMAL.getCode());
        // 性别
        if (getSex() == null) {
            setSex(ESex.UNKNOWN.getCode());
        }
        // 有效时间
        int code = EDisableAtType.TIME_LIMIT.getCode();
        Integer dayGoOn = dto.getDayGoOn();
        setDisableAtType(StringUtil.isBlankObject(dayGoOn) ? EDisableAtType.FOR_EVER.getCode() : code);
        if (getDisableAtType() == code) {
            setDisableAt(new Date(DateUtil.nowLong() + Constant.MILLIS_DAY * dayGoOn));
        } else {
            setDisableAt(null);
        }
        if (StringUtil.isBlankObject(getNickName())) {
            setNickName(DateUtil.nowLong() + "");
        }
        if (StringUtil.isBlankObject(getHeadImg())) {
            setHeadImg(ConstantByMap.DEFAULT_HEAD);
        }
        if (StringUtil.isBlank(getPwd())) {
            setPwd(Constant.getUserPassword());
        } else {
            setPwd(Constant.getUserPassword(getPwd()));
        }
    }

    /**
     * 更新初始化
     */
    public void updateInit() {
        setUpdateNull();
    }

    /**
     * 更新初始化
     */
    protected void setUpdateNull() {
        // 账号密码
        setPwd(null);
        setUsername(null);
        // 头像
        setHeadImg(null);
    }

    /**
     * 更新个人信息初始化
     */
    public void updateProfileInit() {
        setUpdateProfileNull();
    }

    /**
     * 更新个人信息初始化
     */
    protected void setUpdateProfileNull() {
        // 账号密码
        setPwd(null);
        setUsername(null);
        // 头像
        setHeadImg(null);
        // 部门权限
        setDataScope(null);
        setDeptId(null);
        // 有效时间
        setDisableAtType(null);
        setDisableAt(null);
        // 状态
        setStatus(null);
    }

}